首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏SmartSi

    Hive Count Distinct优化

    日常统计场景中,我们经常会对一段时期内的字段进行去重并统计数量,SQL语句类似于 SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...; 这条语句是从一个表的符合 由于引入了DISTINCT,因此在Map阶段无法利用Combine对输出结果去重,必须将id作为Key输出,在Reduce阶段再对来自于不同Map Task、相同Key的结果进行去重,计入最终统计值。 在第二阶段,由于id已经去重,因此 COUNT(*) 操作在Map阶段不需要输出原id数据,只输出一个合并后的计数即可。 改进后的SQL语句如下: SELECT COUNT(*) FROM ( SELECT DISTINCT id FROM TABLE_NAME WHERE … ) t; 在实际运行时,我们发现 它将第二个MapReduce作业Map中的Count过程移到了第一个作业的Reduce阶段。这样在第一阶段Reduce就可以输出计数值,而不是去重的全部id。

    3.8K31发布于 2019-08-07
  • 来自专栏全栈程序员必看

    count(distinct) 与group by 浅析

    (distinct)都是很常见的操作。 count(distinct colA)就是将colA中所有出现过的不同值取出来,相信只要接触过数据库的同学都能明白什么意思。 count(distinct colA)的操作也可以用group by的方式完成,具体代码如下: select count(distinct colA) from table1; select count distinct需要将colA中的所有内容都加载到内存中,大致可以理解为一个hash结构,key自然就是colA的所有值。因为是hash结构,那运算速度自然就快。 总结起来就是,count(distinct)吃内存,查询快;group by空间复杂度小,在时间复杂度允许的情况下,可以发挥他的空间复杂度优势。

    1.2K10编辑于 2022-08-26
  • 来自专栏一树一溪

    count(distinct) 玩出了新花样

    介绍使用索引、临时表 + 文件排序实现 group by,以及单独介绍临时表的三篇文章中,多次以 count(distinct) 作为示例说明。 那还有必要单独为 count(distinct) 写一篇文章吗? 此刻,想到一句台词:别问,问就是有必要。 8. sum(distinct)、avg(distinct) 不一样 sum(distinct)、avg(distinct) 也需要去重,但是和 count(distinct) 不一样的地方在于:sum 因此,对于 sum(distinct)、avg(distinct) 来说,只会选择使用红黑树去重,并且也不会创建一个空的 MEMORY 临时表,这两点和 count(distinct) 不一样。 第 8 小节,介绍了 sum(distinct)、avg(distinct) 只能用于整数、浮点数求和、求平均数,它们和 count(distinct) 不一样的地方在于:只会选择使用红黑树去重,不需要创建

    1.9K20编辑于 2022-09-05
  • 来自专栏陶士涵的菜地

    解决laravel中paginate()与distinct() count语句错误问题

    当项目里面使用paginate()函数进行分页,并且使用了distinct函数进行去重 这个时候自动查询的count语句并没有增加distinct语句 需要指定好字段,这样就可以解决这个问题了 例如 - >distinct("xxxx.id");

    94120发布于 2021-10-28
  • 告别 Count Distinct 慢查询:StarRocks 高效去重全攻略

    在大数据分析中,去重计算(如 Count Distinct)是一个常见但计算开销极高的操作,尤其在高基数和高并发场景下,常常成为查询性能的瓶颈。 SELECT lo_orderdate, lo_custkey, lo_orderkey, count (distinct lo_orderkey) as ndv10, count SELECT count(distinct case when lo_discount > 1 then lo_orderkey else 0 end) as ndv11, count(distinct SELECT count(distinct case when lo_discount > 1 then lo_orderkey else 0 end) as ndv11, count(distinct 查询性能可能会比直接在去重键表上执行 COUNT DISTINCT 更差。

    46410编辑于 2025-08-18
  • 来自专栏数据仓库践行者

    再来说说sparksql中count(distinct)原理和优化手段吧~

    本来以为count(distinct)是老知识点了,之前有总结过相关的内容: sparksql源码系列 | 一文搞懂with one count distinct 执行原理 spark sql多维分析优化 我们知道sparksql处理count(distinct)时,分两种情况: with one count distinct more than one count distinct 这两种情况,sparksql 处理的过程是不相同的 其中【with one count distinct】在sparksql源码系列 | 一文搞懂with one count distinct 执行原理 一文中详细介绍过啦,这篇主要分析一下 如果sql中没有非distinct类的聚合,比如,sql是: select count(distinct a) as a_num, count(distinct b) as b_num (distinct if(b=1,a,null)) as a_num1, count(distinct if(b=3,a,null)) as a_num2 , count(distinct if(b

    3.1K21编辑于 2024-01-16
  • 来自专栏Flink实战剖析

    Count-Distinct实践: 万亿级数据量任务优化方式

    join实践: 万亿级数据量任务优化历程 单字段去重 先看一个简单的sql ,pv_id 去重计数 SELECT visit_type, count(DISTINCT pv_id) distinct 转换为 group by 操作,第一层根据visit_type,pv_id分组,第二层根据visit_type 直接求和即可,使数据分布更加均匀。 (distinct pv_id) as cnt from exp_table where ds=20220320 group by visit_type,hash(pv_id)%50 ) group by 多字段去重 SELECT visit_type, count(distinct pv_id), count(distinct item_id) from exp_table where 思考 Q: 同时存在count distinct 与 sum 类的聚合该如何优化倾斜问题?

    1.2K30编辑于 2022-04-18
  • 来自专栏数据仓库践行者

    sparksql源码系列 | 一文搞懂with one count distinct 执行原理

    在面试时,或多或少会被问到有关count distinct的优化,现在离线任务用到的基本就是hivesql和sparksql,那sparksql中有关count distinct做了哪些优化呢? 实际上sparksql中count distinct执行原理可以从两个点来说明: with one count distinct more than one count distinct 这篇文章主要聊一聊 物理执行计划的几个阶段3、除了count distinct,没有其他非distinct聚合函数的情况的执行原理4、除了count distinct,有其他非distinct聚合函数的情况的执行原理5、关键点调试 先group by,再count Sparksql with one count(distinct) 的情况,相比于hive来说,做了优化 select a,count(distinct b) from by a HashAggregate(keys=[a#3], functions=[count(distinct b#4)], output=[a#3, count(DISTINCT b)#11L]

    1.4K10编辑于 2022-06-09
  • 来自专栏数据和云

    从Approx_Count_Distinct到M7的CPU集成

    昨天和朋友交流,联想起Oracle的两个特性,approx_count_distinct 和 SQL in Silicon,从软件到硬件,从典型SQL入手的优化,Oracle一步一步走向细节和性能的极致 在Oracle 12c中,有一个新的函数被引入进来 - approx_count_distinct 。这个函数的作用是,当我们进行Count Distinct计算时,给出一个近似值。 在很多系统中,COUNT DISTINCT是个常见的操作,如果使用这个函数,则可能带来很好的性能改善。 以下是我非常简单的一个测试,可以看到基本的效果: ? approx_count_distinct在大数据量下的表现会非常好,资源使用非常低,极其稳定。 count(*) 和 count distinct 都是非常常见的操作,也很消耗资源。从常见、常用的SQL入手,Oracle的一点点改进都会给用户带来帮助,在细节上的优化Oracle做到极致了。

    1K50发布于 2018-03-05
  • 来自专栏数据库与编程

    Oracle 12c新特性之:APPROX_COUNT_DISTINCT 函数

    SELECT COUNT(DISTINCT object_name) AS obj_count FROM all_objects; OBJ_COUNT ---------- 47171 相比之下,新的APPROX_COUNT_DISTINCT函数不提供准确的结果,但应该给出“可以忽略不计的精确结果”。 SELECT APPROX_COUNT_DISTINCT(object_name) AS obj_count FROM all_objects; OBJ_COUNT ---------- SET TIMING ON SELECT COUNT(DISTINCT object_name) AS obj_count FROM all_objects; OBJ_COUNT ------ SET TIMING ON SELECT COUNT(DISTINCT data) AS data_count FROM t1; DATA_COUNT ---------- 10000

    66330编辑于 2022-04-24
  • 来自专栏大鹅专栏:大数据到机器学习

    MongoDB 常用操作笔记 find ,count, 大于小于不等, select distinct, groupby,索引

    判断元素是否存在 exists4. select distinct的实现:5. 查询嵌入对象的值6. 数组大小匹配 size7. 全部匹配 本博客将列举一些常用的MongoDB操作,方便平时使用时快速查询,如find, count, 大于小于不等, select distinct, groupby等 1. db.things.find( { a : { $exists : true } } ); db.things.find( { a : { $exists : false } } ); 4. select distinct

    4.5K20发布于 2021-06-16
  • 来自专栏应用计算

    第二篇 -COUNT DISTINCT:SPL轻量级文件存储提速查询实践

    SQL 中的去重计数 COUNT DISTINCT 一直比较慢。去重本质上是分组运算,需要把遍历过的分组字段值都保持住,用于后续的比对。结果集太大时,还要把数据写到硬盘上做缓存,性能低下。 SQL 语句是这样:select count(distinct user_id) from events;执行这个 SQL 需要 7 秒。 SQL 是这样:select count(distinct case when event_type = 1 then user_id end) as count1, count(distinct case when event_type = 7 then user_id end) as count2from events;执行时间是 5 秒。 if(event_type==1,user_id)):count1,条件成立,得到 user_id,不成立得到 null。

    22610编辑于 2025-09-12
  • 来自专栏arebirth重生者的IT之路

    count(*) count(id) count(1) count(字段)

    ---- count(id)   InnoDB引擎会遍历整张表,把每一行行的id值全部取出来,返回给server层,server层拿到id后,判断是不可能为空的,就按行累加。 count(1)   InnoDB引擎遍历整张表,但不取值,server层对于返回的每一行,放一个数字 1 进去,判断是不可能为空的,累计增加。 count(字段)   1.如果这个字段是定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加   2.如果这个字段定义允许为null的话,判断到有可能是 count(*)   不会把全部的字段取出来,而是做专门的优化,不取值,count(*)肯定不是null,按行累加。 总结:count(*)>count(1)>count(id)>count(字段)

    1.9K10发布于 2020-06-19
  • 来自专栏JavaEdge

    MySQL count()函数及其优化count(1),count(*),count(字段)区别

    (1),count(*),count(字段)区别 count(1)和count(*) 作用 都是检索表中所有记录行的数目,不论其是否包含null值 区别 count(1)比count(*)效率高 二 . count(字段)与count(1)和count(*)的区别 count(字段)的作用是检索表中的这个字段的非空行数,不统计这个字段值为null的记录 任何情况下SELECT COUNT(1) FROM WHERE COL2 = ‘value’ 的出现 如果表没有主键,那么count(1)比count(*)快 如果有主键,那么count(主键,联合主键)比count(*)快 如果表只有一个字段,count (*)最快 count(1)跟count(主键)一样,只扫描主键。 count(*)跟count(非主键)一样,扫描整个表 明显前者更快一些。

    4K60发布于 2018-05-16
  • count(1)count(*)和count(列名)区别

    1、效果上: count(1)忽略所有列,用1代表行,不会忽略为NULL列。 count(*)含所有列,不会忽略为NULL列。 count(列名)只含列名那列,忽略列值为null的计数,而不忽略空字符串或者0,即某个字段值为NULL时,不统计。 2、效率上: 若列名是主键,count(列名)比count(1)快。 若列名不是主键,count(1)比count(列名)快。 若多个列没有主键,则 count(1)效率优于 count(*)。 若存在主键,则 select count(主键)的执行效率是最优的 。 若表只有一个字段,则 select count(*)最优。

    25510编辑于 2025-12-23
  • 来自专栏CSDN

    count(列名)、 count(常量)、 count(*)区别

    count(列名)、 count(常量)、 count(*)区别 开发过程中总是纠结于count时到底是用count(列名)、 count(常量)、 count(*)其中的哪个,用哪个统计数据的效率会高些 (列名)、 count(常量)来替代count(*)。 count(列名)、 count(常量)、 count(*)区别 说了以上的这么多背景,下面来说一下这三个的区别: 三者区别 COUNT(常量) 和 COUNT(*)表示的是直接查询符合条件的数据库表的行数 COUNT(*)和COUNT(1) 对于COUNT(1)和COUNT(*),MySQL的优化是完全一样的,根本不存在谁比谁快! 那既然COUNT(*)和COUNT(1)一样,建议用哪个呢? 相比COUNT(*),COUNT(字段)多了一个步骤就是判断所查询的字段是否为NULL,所以他的性能要比COUNT(*)慢。

    67010编辑于 2024-03-28
  • 来自专栏hml_知识记录

    SQL命令 DISTINCT

    如果DISTINCT子句中指定的列包含NULL(不包含值)行,则DISTINCT将返回一行作为DISTINCT(唯一)值的NULL,如以下示例所示: SELECT DISTINCT FavoriteColors DISTINCT子句与GROUP BY子句一起使用,则DISTINCT子句将被忽略。 与SELECT DISTINCT子句不同,聚合函数中的DISTINCT不包括NULL作为DISTINCT(唯一)值。 DISTINCT和%ROWID 指定DISTINCT关键字会导致基于游标的嵌入式SQL查询不设置%ROWID变量。即使DISTINCT不限制返回的行数,也不设置%ROWID。 ,"RowID: ",%ROWID," row count: ",%ROWCOUNT w " Name=",name," State=",state } &sql(

    5.9K10编辑于 2022-04-22
  • 来自专栏程序员奇点

    MYSQL 下 count(*)、count(列)、 count(1) 理解

    执行效率上: 列名为主键,count(列名)会比count(1)快 (待商榷) 列名不为主键,count(1)会比count(列名)快 (确定) 如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*) (待商榷) 如果有主键,则 select count(主键)的执行效率是最优的 (待商榷) 如果表只有一个字段,则 select count(*)最优。 , 无条件查询情况下 可以得到结论 count(主键) count(*) count(1) 效率远高于 count(非主键列) count(*) count(1), count(列,主键) 执行计划基本上是一样的 count(列名(非主键)) 比如 count*name 的执行计划 type = All 是进行的全表扫描,而count(*) count(1), count(列,主键) COUNT(1)只有在第一列被定义为NOT NULL时才进行与COUNT(*)相同的优化

    3.1K41发布于 2019-08-29
  • 来自专栏全栈程序员必看

    MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

    首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。 所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。 count(可空字段) 扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 count(非空字段)与count(主键 id) 扫描全表,读到server层, 注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。 性能对比结论 count(可空字段) < count(非空字段) = count(主键 id) < count(1) ≈ count(*) 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn

    3.8K10编辑于 2022-07-12
  • 来自专栏码农编程进阶笔记

    MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

    首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。 所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。 count(可空字段) 扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 count(非空字段)与count(主键 id) 扫描全表,读到server层, 注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。 性能对比结论 count(可空字段) < count(非空字段) = count(主键 id) < count(1) ≈ count(*)

    3.5K30发布于 2021-07-20
领券